/**
 * 树节点
 *
 * 对于树形组件，我们希望用一种统一的方式进行处理，
 *
 * 所有的数据，都需要转换成这种标准格式，才能接入各种组件。
 *
 * 注意：
 * - 尽量保证数据准确性，如果子节点指向父节点，在计算的时候，容易会产生无限递归。
 * - 对于这个问题，我们做了一定处理，但是仍然存在风险，需要保证数据的准确性。
 */
export default class TreeNode {
    /**
     * 自身 ID
     */
    id: string | number;

    /**
     * 父级 ID
     */
    pid: string | number;

    /**
     * 数据类型
     */
    type: string | number | undefined;

    /**
     * 节点名称
     */
    label: string;

    /**
     * 图标（可以是 icon，也可以是图片地址）
     */
    icon: string | undefined;

    /**
     * 树的层级（暂时没有解析这一字段，因此一般是 undefined）
     */
    level: number | undefined;

    /**
     * 原始数据
     */
    data: any;

    /**
     * 是否选中
     */
    checked: boolean;

    /**
     * 经过模糊检索等算法，过滤之后剩下的节点，算法上需要的标记位
     */
    hit: boolean;

    /**
     * 父节点（暂时定为对象，实际一个节点可能属于多个父节点，目前这个字段只是用于寻找根节点，这不会引起什么问题）
     */
    parent: TreeNode | undefined;

    /**
     * 子节点
     */
    children: TreeNode[] | undefined;

    /**
     * 是否有父节点
     */
    hasParent(): boolean {
        return this.parent !== undefined;
    }

    /**
     * 是否有子节点
     *
     * @returns {boolean}
     */
    hasChildren(): boolean {
        return this.children !== undefined && this.children != null && this.children.length > 0;
    }
}